from types import MethodType


# 正常情况下，当我们定义了一个class，创建了一个class的实例后，我们可以给该实例绑定任何属性和方法，这就是动态语言的灵活性。
class Book(object):
    pass


b = Book()
b.name = '《Python学习指南》'  # 绑定属性
b.price = 36.9
print(b.name + ' 售价：' + str(b.price))


def set_author(self, author):
    self.author = author


def set_publish(self, publish):
    self.publish = publish


Book.set_publish = set_publish  # 给类绑定方法 每个实例都可以调用
b.set_author = MethodType(set_author, b)  # 仅给当前实例对象绑定方法
b.set_author('廖雪峰')
print('《Python学习指南》的作者是：' + b.author)
b.set_publish('中信出版社')
print('《Python学习指南》由' + b.publish + '出版')

# Python允许在定义class的时候，定义一个特殊的__slots__变量，来限制该class实例能添加的属性。
# 定义的属性仅对当前类实例起作用，对继承的子类是不起作用的。
# 除非在子类中也定义__slots__，这样，子类实例允许定义的属性就是自身的__slots__加上父类的__slots__。


class People(object):
    __slots__ = ('name', 'age')


p1 = People()
p1.name = 'Stone'
p1.age = 20


class Student(People):
    __slots__ = ('score', 'teacher')


s1 = Student()
s1.score = 99
s1.teacher = '廖雪峰'











